搜索 K
Appearance
博客正在加载中...
Appearance
除了 TextField,还有不少其他 Field 对象,本文就来介绍下它们
首先,不是所有内容都适合用 TextField(其本质是 String)保存:
TextField 默认是分词的此时我们就得谈谈 Field 域的属性:
注意存储不存储,是不影响查询的,我们查询的是索引,而不是内容。但如果要在查询后展示内容,就必须存储
StringField(FieldName, FieldValue, Store.YES),字符串类型,这个 Field 用来构建一个字符串 Field,但是不会进行分析(分词),会将整个串存储在索引中,比如(订单号,身份证号等)。是否存储在文档中用 Store.YES 或 Store.NO 决定LongPoint(String name, long... point),Lone 类型,还有 IntPoint 等类型存储数值类型的数据,让数值类型可以进行索引。但是不能存储数据,如果想存储数据还需要使 StoredField。StoredField(FieldName, FieldValue),重载方法,支持多种数据类型,这个 Field 用来构建不同类型 Field 不分析,不索引,但要 Field 存储在文档中TextField(FieldName, FieldValue, Store.NO) 或 TextField(FieldName, reader),如果是一个 Reader, lucene 猜测内容比较多,会采用 Unstored 的策略 关于这几个 Filed 类型的属性,这里列一个表格:| Field 类 | 数据类型 | Analyzed 是否分析 | Indexed 是否索引 | Stored 是否存储 |
|---|---|---|---|---|
| StringField | 字符串 | N | Y | Y 或 N |
| LongPoint | Long 型 | Y | Y | N |
| StoredField | 支持多种数据类型 | N | N | Y |
| TextField | 字符串或流 | Y | Y | Y 或 N |
| | ||||
| 比如订单号,身份证号等类型,可以用 StringField 存储,因为分词了没啥用;但是我们需要索引,将来可以用整个订单后或者身份证号来搜索。至于是否存储则按需使用。 |
比如文件路径可以用 StoredField 来存储,因为我们不需要分析和索引,只需存储就行。
而最后的 TextField 是用的比较多的,一般内容都是用这个。
我们重新创建一个类 LuceneSecond.java,并创建方法 createIndex,其代码和之前的代码几乎一样,除了以下几点: 使用 StoredField 存储 fieldPath,并创建 fieldSize 和 fieldSizeStore 的 Field 对象
// 4. 创建Field
// 参数1:域的名称, 参数2:域的内容, 参数3:是否存储
Field fieldName = new TextField("name", fileName, Field.Store.YES);
Field fieldPath = new StoredField("path", filePath);
Field fieldContent = new TextField("content", fileContent, Field.Store.YES);
// Field fieldSize = new TextField("size", String.valueOf(fileSize), Field.Store.YES);
Field fieldSize = new LongPoint("size", fileSize);
Field fieldSizeStore = new StoredField("size", fileSize); 添加 Field 的时候,也加上新创建的 2 个 Field 对象:
// 4. 将field添加到document对象中。
Document document = new Document();
document.add(fieldName);
document.add(fieldPath);
document.add(fieldContent);
document.add(fieldSize);
document.add(fieldSizeStore);然后我们删除之前的索引库,并重新创建。此时用 luke 查看,就会发现 path 和 size 是没有分词(Term 的)
但是 path 和 size 是存储了的,我们可以看 documents 选项卡:
